In network communications, data may be transported using an underlying channel, such as Transport Control Protocol (TCP). For example, two people may communicate with each other using an instant messaging (IM) application. The two people each run instances of the IM application on their respective machines, and these two instances of the IM applications send messages to each other over a network. However, the IM application typically does not implement the transport of data. Rather, the IM application uses an existing data transport channel, such as TCP, to transport the data from one person's machine to another. In addition to IM, applications such as on-line conferencing, voice communications, audio streaming, etc., may use TCP or other existing channels to transport data.
There are various channels through which data may be transported. In addition to TCP, data may also be carried via the User Datagram Protocol (UDP), guaranteed-delivery relay services such as Traversal Using Relay Network address translation (TURN), non-guaranteed-delivery relay services such as Microsoft Messenger service, or various other channels. When data is to be sent, in theory the data could be carried by any of these channels. From the perspective of a program that sends data from one place to another, the program is performing its function as long as the data gets transported from point A to point B, regardless of the actual mechanism that is used to transport the data. Thus, a service could be provided to the program that sends data over some channel, while hiding the details of the particular channel that is being used.
The service could provide “reliable” transmission of data. Data transmission can be either “reliable” (in the sense that delivery of the data is guaranteed), or “non-reliable” (in the sense that data delivery is not guaranteed). Some of the underlying channels that the service could use already provide reliable transmission of data, while other channels are non-reliable. Of the example channels mentioned above, TCP and TURN are considered reliable, while UDP and Microsoft Messenger are considered non-reliable. Reliability mechanisms are generally implemented through an acknowledgment scheme, in which receipt of data is acknowledged, and any data that is not acknowledged is retransmitted. A system of acknowledgments and retransmission may be implemented on top of a non-reliable channel in order to provide guaranteed delivery. However, when this system of acknowledgments and retransmission is implemented on top of an already-reliable channel, then the added acknowledgments may create extra traffic that decreases throughput. Using one reliability mechanism on top of another may also create various types of conflicts between the mechanisms. For example, the TCP congestion control algorithm has been found to conflict with a stacked TCP congestion algorithm, and could significantly degrade the end-to-end throughput.